import router from '@/router/index.js'
import { useUserStore } from '@/stores/user.js'
import { logPageAccess, logPermissionDenied } from '@/utils/accessLogger.js'

// 白名单路由，不需要权限验证
const whiteList = ['/login']

/**
 * 检查用户是否有权限访问某个路由
 * @param {Array} roles 路由所需的角色列表
 * @param {String} userRole 用户当前角色
 * @returns {Boolean} 是否有权限
 */
function hasPermission(roles, userRole) {
  if (!roles || roles.length === 0) {
    return true // 如果路由未设置角色，则允许访问
  }

  return roles.includes(userRole)
}

/**
 * 检查路由是否匹配
 * @param {String} path 路由路径
 * @param {Object} route 路由对象
 * @returns {Boolean} 是否匹配
 */
function isRouteMatch(path, route) {
  // 精确匹配
  if (route.path === path) return true

  // 前缀匹配（处理子路由）
  if (path.startsWith(route.path + '/')) return true

  // 404路由匹配
  if (route.path === '/:pathMatch(.*)*') return true

  return false
}

/**
 * 获取匹配的路由配置
 * @param {String} path 当前路径
 * @param {Array} routes 路由配置数组
 * @returns {Object|null} 匹配的路由配置
 */
function getMatchedRoute(path, routes) {
  for (const route of routes) {
    if (isRouteMatch(path, route)) {
      return route
    }

    // 递归检查子路由
    if (route.children && route.children.length > 0) {
      const matchedChild = getMatchedRoute(path, route.children)
      if (matchedChild) {
        return matchedChild
      }
    }
  }

  return null
}

// 路由守卫
router.beforeEach(async (to, from, next) => {
  // 显示加载状态（如果有的话）
  // 例如：NProgress.start()

  // 获取用户存储实例
  const userStore = useUserStore()

  // 加载用户信息（处理页面刷新情况）
  if (!userStore.isLoggedIn) {
    userStore.loadUserInfo()
  }

  // 如果在白名单中，直接访问
  if (whiteList.includes(to.path)) {
    next()
    return
  }

  // 如果没有登录，跳转到登录页
  if (!userStore.isLoggedIn) {
    next(`/login?redirect=${to.fullPath}`)
    return
  }

  // 如果已登录且访问的是登录页，跳转到首页
  if (to.path === '/login') {
    next('/')
    return
  }

  // 检查是否为404页面
  if (to.name === 'PageNotFound') {
    // 404页面不需要权限验证，直接访问
    next()
    return
  }

  // 获取所有路由配置
  const allRoutes = router.options.routes

  // 查找匹配的路由配置（包括嵌套路由）
  const matchedRoute = getMatchedRoute(to.path, allRoutes)

  // 如果没有匹配到任何路由，Vue Router会自动匹配404路由
  // 我们只需要确保权限验证逻辑正确处理404路由

  // 权限验证
  if (matchedRoute && matchedRoute.meta && matchedRoute.meta.roles) {
    // 如果路由配置了角色权限
    if (hasPermission(matchedRoute.meta.roles, userStore.getUserRole)) {
      // 用户角色有权限访问
      next()
    } else {
      // 用户角色无权限访问，跳转到无权限页面或首页
      logPermissionDenied(to, userStore)
      next('/403')
      return
    }
  } else {
    // 如果路由没有配置角色权限，默认允许访问
    next()
  }

  // 记录页面访问日志
  logPageAccess(to, from, userStore)
})

// 全局后置钩子
router.afterEach((to) => {
  // 结束加载状态（如果有的话）
  // 例如：NProgress.done()

  // 设置页面标题
  if (to.meta && to.meta.title) {
    document.title = to.meta.title
  } else {
    document.title = 'Admin Manage System'
  }
})

export default router
